﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Npgsql;
using NpgsqlTypes;
using System.Data;

/**
 * Clase para manejar las personas
 */
public class Persona : Conexion
{
    private String tipoPersona;
    private String nombre;
    private String apellido;
    private String tipoDoc;
    private int nroDocumento;
    private DateTime fechaRegistro;
    private String sexo;
    private String telefono;
    private String email;
    private String direccion;
    private String ciudad;
    private int id;
 
    public Persona() 
    {
      
    }


    //Guarda la persona en la base de datos
    public virtual void Guardar()
    {

        SentenciaSQL = "insert into persona(id_persona, tipo_persona, nombre, apellido, tipo_doc, nro_documento, fecha_registro, sexo, telefono,	email, direccion, ciudad) values( nextval('sq_persona'), '" + TipoPersona + "', '" + Nombre + "', '" + Apellido + "', '" + TipoDoc + "'," + NroDocumento+ ", '" + FechaRegistro.ToShortDateString() + "', '" + Sexo + "', '" + Telefono + "', '" + Email+ "', '" + Direccion + " ', '" + Ciudad + "');";


        AbrirConexion();
        IniciarTransaccion();
        
        try {
            EjecutarComando();
            SetearId();
            ConfirmarTransaccion();
            
        }
        catch (ConexionException e)
        {
            CancelarTransaccion();
            throw new ConexionException("ocurrio un error al guardar la persona", e);
        }
        finally {
            CerrarConexion();
        }

       
       

    }


    /**
     * Guarda la persona en la base de datos sin controlar transacciones
     * Requiere que la conexion esté abierta
     */
    public void GuardarSinTransaccion()
    {
        SentenciaSQL = "insert into persona(id_persona, tipo_persona, nombre, apellido, tipo_doc, nro_documento, fecha_registro,	sexo, telefono,	email, direccion, ciudad) values( nextval('sq_persona'), '" + TipoPersona + "', '" + Nombre + "', '" + Apellido + "', '" + TipoDoc + "'," + NroDocumento + ", '" + FechaRegistro.ToShortDateString() + "', '" + Sexo + "', '" + Telefono + "', '" + Email + "', '" + Direccion + " ', '" + Ciudad+ "');";
       
        try
        {
            EjecutarComando();
            SetearId();
        }
        catch (ConexionException e)
        {
          
            throw new ConexionException("ocurrio un error al guardar la persona", e);
        }
       
    }

    /**
     * Actualiza los datos de una persona sin controlar transaccines
     * Requiere que la conexion esté abierta
     */
    public void ActualizarSinTransaccion(){
        SentenciaSQL = "update persona set tipo_persona = '" + TipoPersona + "', nombre = '"+ Nombre+ "', apellido = '"+Apellido+"', tipo_doc = '"+TipoDoc +"', nro_documento = '"+NroDocumento+"' , fecha_registro = '"+FechaRegistro.ToShortDateString()+"', sexo = '"+Sexo+"', telefono = '"+Telefono+"', email = '"+Email+" ', direccion = '"+Direccion+"', ciudad = '"+Ciudad+"' where id_persona = '"+ Id + "';";
        try
        {
            EjecutarComando();            
        }
        catch (ConexionException e)
        {
            throw new ConexionException("ocurrio un error al modificar la persona", e);
        }
    }


    /**
     * Sete el Id de la persona con el nro el cual fue insertada
     */
    private void SetearId() {
        SentenciaSQL = "select last_value from sq_persona";
        
        try
        {
            DataSet ds = EjecutarComandoDataSet();
            DataTable tabla = ds.Tables[0];
            this.id = Convert.ToInt32(tabla.Rows[0]["last_value"]);

        }
        catch (ConexionException e)
        {
            throw new ConexionException("ocurrio un error al obtener el id de la persona", e);
        }
       
    }




    /**
     * Getters y Setters
     */

    public String TipoPersona
    {
        get { return this.tipoPersona; }
        set { this.tipoPersona = value; }
    }

    public String Nombre
    {
        get { return this.nombre; }
        set { nombre = value; }
    }

    public String Apellido
    {
        get { return this.apellido; }
        set { this.apellido = value; }
    }

    public String TipoDoc
    {
        get { return this.tipoDoc; }
        set { this.tipoDoc = value; }

    }

    public int NroDocumento
    {
        get { return this.nroDocumento; }
        set { this.nroDocumento = value; }
    }

    public DateTime FechaRegistro
    {
        get { return this.fechaRegistro; }
        set { this.fechaRegistro = value; }
    }

    public String Sexo
    {
        get { return this.sexo; }
        set { this.sexo = value; }
    }

    public String Telefono
    {
        get { return this.telefono; }
        set { this.telefono = value; }
    }

    public String Email
    {
        get { return this.email; }
        set { this.email = value; }
    }

    public String Direccion
    {
        get { return this.direccion; }
        set { this.direccion = value; }
    }

    public String Ciudad
    {
        get { return this.ciudad; }
        set { this.ciudad = value; }
    }

    public int Id {
        get { return this.id; }
        set { this.id = value; }
    }
}
